/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    2013 year
 *    Author: Esipenko Aleksey (Alexorleon)
 *    E-Mail: alexorleon@gmail.com
 */
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "global.h"
#include "proxymodel.h"
#include "tablemodel.h"
#include "createnewqr.h"
#include "createnewperformer.h"
#include "createnewplacement.h"
#include "createnewhistory.h"
#include "createnewcontact.h"
#include "settingsdialog.h"
#include "addplace.h"
#include <QStringList>
#include <QStringListModel>
#include <QDateEdit>
#include <QFileDialog>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QPrinter>
#include <QDebug>

namespace {
const int MaxColumns = 3;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //--Init--
    mainRequest = "";
    settings = new QSettings(this);
    loadSettings();

    model = new TableModel(this);
    proxyModel = new ProxyModel(this);
    proxyModel->setSourceModel(model);

    ui->tableView->setModel(proxyModel);
    ui->tableView->verticalHeader()->setDefaultAlignment(Qt::AlignVCenter|Qt::AlignRight);
    ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

    // проверяем каталоги
    QDir maindir;
    if( !maindir.exists("database")){
        maindir.mkdir("database");
    }

    if( !maindir.exists("images")){
        maindir.mkdir("images");
    }

    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName("./database/qrdatabase.qrdb");
    if(!database.open()){
        qDebug()<<"not database";
    }
    QSqlQuery query_fk;
    query_fk.exec("PRAGMA foreign_keys=ON;");

    /*QSqlQuery query;
    query.exec("SELECT * FROM qrcode;");

    QSqlRecord rec = query.record();
    int        nNumber = 0;
    QString    strName;
    QString    strPhone;
    QString    strEmail;
    QString    qrtext;
    int        performer = 0;
    int        placement = 0;
    int        history = 0;

    while (query.next()) {
        nNumber  = query.value(rec.indexOf("id")).toInt();
        strName  = query.value(rec.indexOf("date_time")).toString();
        strPhone = query.value(rec.indexOf("status")).toString();
        strEmail = query.value(rec.indexOf("qrpath")).toString();
        qrtext = query.value(rec.indexOf("qrtext")).toString();
        performer  = query.value(rec.indexOf("performer")).toInt();
        placement  = query.value(rec.indexOf("placement")).toInt();
        history  = query.value(rec.indexOf("history")).toInt();

        qDebug() <<nNumber<<"\t"<<strName<<"\t"<<strPhone<<"\t"<<strEmail
                   <<"\t"<<qrtext<<"\t"<<performer<<"\t"<<placement<<"\t"<<history;
    }*/

    /*QSqlQueryModel m;
    m.setQuery("SELECT id, status FROM qrcode WHERE id=1;");
    ui->tableView->setModel(&m);
    ui->tableView->show();*/

    /*QSqlQueryModel *m = new QSqlQueryModel;
    m->setQuery("SELECT * FROM qrcode");
    ui->tableView->setModel(m);
    ui->tableView->show();

    ui->listView->setModel(m);
    ui->listView->show();*/

    /*QSqlTableModel *m = new QSqlTableModel;
    m->setTable("qrcode");
    m->select();
    m->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui->tableView->setModel(m);
    ui->tableView->show();*/

    createConnections();
    requestPerformers();
    requestPlacements();
    requestdatabase(" WHERE date_time='"+QDate::currentDate().toString(Qt::ISODate)+"'");

    // диактивируем кнопки
    //ui->action_generate->setEnabled(false);

    // init status
    QStringList listStatus;
    listStatus << tr("Статус...")
               << tr("Создан")
               << tr("Размещен");
    ui->choiceStatus->setModel(new QStringListModel(listStatus));

    // date
    ui->dateEdit_s->setCalendarPopup(true);
    ui->dateEdit_po->setCalendarPopup(true);
    setCurrentDate();

    QSize s(48,48);
    ui->mainToolBar->setIconSize(s);

    //setWindowIcon(QIcon(":/images/images.png"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::createConnections(){

    connect(ui->action_exit,SIGNAL(triggered()),this,SLOT(close()));

    connect(ui->action_new,SIGNAL(triggered()),this,SLOT(slot_newQRcode()));
    connect(ui->action_add_performer,SIGNAL(triggered()),this,SLOT(slot_newPerformer()));
    connect(ui->action_add_placement,SIGNAL(triggered()),SLOT(slot_newPlacement()));
    connect(ui->action_add_history,SIGNAL(triggered()),this,SLOT(slot_newHistory()));
    connect(ui->action_add_contact,SIGNAL(triggered()),this,SLOT(slot_newContact()));
    connect(ui->action_pdf,SIGNAL(triggered()),this,SLOT(slot_exportToFile()));
    connect(ui->action_deleteItem,SIGNAL(triggered()),this,SLOT(slot_deleteQR()));
    connect(ui->action_sample,SIGNAL(triggered()),this,SLOT(slot_sample()));
    connect(ui->action_saveImage,SIGNAL(triggered()),this,SLOT(slot_saveImage()));
    connect(ui->action_setting,SIGNAL(triggered()),this,SLOT(slot_settings()));
    connect(ui->action_about,SIGNAL(triggered()),this,SLOT(slot_about()));

    connect(ui->tableView,SIGNAL(clicked(QModelIndex)),this,SLOT(slot_viewQRText()));

    // date
    connect(ui->dateEdit_s,SIGNAL(dateChanged(QDate)),this,SLOT(slot_changeDate_s()));
    connect(ui->dateEdit_po,SIGNAL(dateChanged(QDate)),this,SLOT(slot_changeDate_po()));

    connect(ui->btnReset,SIGNAL(clicked()),this,SLOT(slot_resetDate()));
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    /*if (okToClearData())
        event->accept();
    else
        event->ignore();*/
    saveSettings();
    event->accept();
}

void MainWindow::requestPerformers(){

    ui->choicePerformer->clear();
    // значение по умолчанию
    ui->choicePerformer->addItem(tr("Исполнитель..."), 0);

    QSqlQuery query;
    query.prepare("SELECT id, performer FROM performers;");
    query.exec();
    // добавляем id в качестве дополнительной информации для ускорения выборок
    while(query.next()){
        ui->choicePerformer->addItem(query.value(1).toString(), query.value(0).toInt());
    }
}

void MainWindow::requestPlacements(){

    ui->choicePlacement->clear();
    // значение по умолчанию
    ui->choicePlacement->addItem(tr("Место размещения..."), 0);

    QSqlQuery query;
    query.prepare("SELECT id, placement FROM placements;");
    query.exec();
    // добавляем id в качестве дополнительной информации для ускорения выборок
    while(query.next()){
        ui->choicePlacement->addItem(query.value(1).toString(), query.value(0).toInt());
    }
}

void MainWindow::slot_sample(){

    QString request("");

    QStringList requestlist;
    // учитываем временной диапазон
    if(ui->considerDate->isChecked()){
        requestlist.append("qrcode.date_time>=('"+ui->dateEdit_s->date().toString(Qt::ISODate)+
                       "') AND qrcode.date_time<=('"+ui->dateEdit_po->date().toString(Qt::ISODate)+"')");
    }

    if(ui->choiceStatus->currentIndex() != 0){
        requestlist.append("qrcode.status='"+ui->choiceStatus->currentText()+"'");
    }

    if(ui->choicePerformer->currentIndex() != 0){
        requestlist.append("qrcode.performer="+ui->choicePerformer->itemData(ui->choicePerformer->currentIndex()).toString());
    }

    /*if(ui->choicePlacement->currentIndex() != 0){
        requestlist.append("placement="+ui->choicePlacement->itemData(ui->choicePlacement->currentIndex()).toString());
    }*/
    /*if(ui->choicePlacement->currentIndex() != 0){
        requestlist.append("places.idqr = qrcode.id AND places.idqr="+ui->choicePlacement->itemData(ui->choicePlacement->currentIndex()).toString());
    }*/
    if(ui->choicePlacement->currentIndex() != 0){
        requestlist.append("places.idqr = qrcode.id AND places.idplacement="+ui->choicePlacement->itemData(ui->choicePlacement->currentIndex()).toString());
    }

    int listsize = requestlist.size();
    // если список не пустой, то составляем запрос
    if(listsize != 0){
        request = " WHERE ";
        for(int i = 0; i < listsize; ++i){
            request.append(requestlist.at(i));
            // если в списке есть еще элемент, то добавляем к запросу
            if(listsize > i+1){
                request.append(" AND ");
            }
        }
    }
    qDebug()<<request;
    requestdatabase(request);
}

void MainWindow::requestdatabase(const QString &req){

    QString firstRequest("SELECT qrcode.id, qrcode.date_time, qrcode.status, qrcode.qrpath, "
                         "qrcode.performer, places.idqr FROM qrcode, places");
    // запрос без второй таблицы, для исключения дублирования информации и уменьшения сложности запроса
    QString secondRequest("SELECT qrcode.id, qrcode.date_time, qrcode.status, qrcode.qrpath, "
                          "qrcode.performer FROM qrcode");
    QString request(req);

    if( !request.isEmpty()){

        mainRequest = request;
        QStringList queryList;
        // очищаем модель
        model->modelClear();
        // производим выборку
        QSqlQuery query;
        QSqlQuery queryPerform;
        if(ui->choicePlacement->currentIndex() == 0){
            // запоминаем запрос
            query.prepare(secondRequest+request+";");
        }else{
            query.prepare(firstRequest+request+";");
        }
        //query.addBindValue();
        query.exec();

        // для исключения дублирования
        int id = 0;
        int old_id = -1;
        while(query.next()){

            id = query.value(0).toInt();
            // пропускаем если равен предыдущему
            if(id == old_id) continue;
            old_id = id;
            queryList.append(query.value(1).toString());
            queryList.append(query.value(2).toString());
            queryList.append(query.value(3).toString());

            QString tempPerform = query.value(4).toString();
            // забираем исполнителя для этого QR-кода
            queryPerform.prepare("SELECT performer FROM performers WHERE id="+tempPerform+";");
            queryPerform.exec();
            if(queryPerform.next()){
                queryList.append(queryPerform.value(0).toString());
            }else{
                // предостережение
                queryList.append("NULL");
            }

            model->addData(id, queryList);
            queryList.clear();
        }
        // обновляем данные в tableview
        model->resetModel();
        ui->qrtext->clear();
    }
}

void MainWindow::slot_deleteQR(){

    if(ui->tableView->currentIndex().isValid()){

        // запоминаем все выделенные строки
        QItemSelection selection(ui->tableView->selectionModel()->selection());
        if(selection.isEmpty()) return;

        QMessageBox msgBox;
        msgBox.setWindowTitle(tr("Удаление QR-кодов"));
        msgBox.setText(tr("QR-коды будут удалены из базы данных."));
        msgBox.setInformativeText(tr("Вы уверены что хотите их удалить?"));
        msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
        msgBox.setDefaultButton(QMessageBox::Cancel);
        msgBox.button(QMessageBox::Ok)->setText(tr("Удалить"));
        msgBox.button(QMessageBox::Cancel)->setText(tr("Отмена"));
        int ret = msgBox.exec();

        if(ret == QMessageBox::Ok){

            QList<int> rows;
            QStringList listDeleteFiles;
            int item = 0;
            foreach(const QModelIndex &index, selection.indexes() ){
                item++;
                if(item % 3 == 0){
                    rows.append(model->data(index, Qt::UserRole).toInt());
                    listDeleteFiles.append(model->data(index, 33).toString());
                }
            }
            qSort(rows);

            qDebug()<<"rows= "<<rows;
            database.transaction();

            QSqlQuery query;
            for(int i = 0; i < rows.count(); i++){

                query.prepare("DELETE FROM qrcode WHERE id=?;");
                query.addBindValue(rows.at(i));
                query.exec();
            }

            database.commit();

            // удаляем файлы из каталога
            QFile file;
            for(int i = 0; i < listDeleteFiles.count(); ++i){
                file.remove(listDeleteFiles.at(i));
            }

            requestdatabase(mainRequest);
        }

        qDebug()<<"--------------------------";
        qDebug()<<"--------------------------";

        model->test();
    }
}

void MainWindow::slot_newQRcode(){

    database.transaction();

    // создаем форму для редактирования
    CreateNewQR dedit;
    dedit.setWindowTitle(tr("Новый QR-код"));

    // если прилетело ОК
    if(dedit.exec() == QDialog::Accepted){
        qDebug()<<"QR-код успешно создан";

        database.commit();
        requestdatabase(mainRequest);
    }else{
        dedit.deleteFiles();
        database.rollback();
    }
}

void MainWindow::slot_newPerformer(){

    database.transaction();

    // создаем форму для редактирования
    CreateNewPerformer dedit;
    dedit.setWindowTitle(tr("Редактирование исполнителей"));

    // если прилетело ОК
    if(dedit.exec() == QDialog::Accepted){

        database.commit();
        // перезаполняем исполнителей
        requestPerformers();
        requestdatabase(mainRequest);
    }else{
        database.rollback();
    }
}

void MainWindow::slot_newPlacement(){

    //if(ui->tableView->currentIndex().isValid()){

        // запоминаем все выделенные строки
        QItemSelection selection(ui->tableView->selectionModel()->selection());
        QItemSelectionModel *selectionModel = ui->tableView->selectionModel();

        // определяем количество выделенных строк
        QList<int> rows;
        foreach(const QModelIndex &index, selection.indexes() ){
            rows.append(index.row());
        }
        // выделен должен быть только один
        if (!selectionModel->hasSelection() || rows.size() / MaxColumns > 1){
            // открываем диалог создания новых мест размещения
            qDebug()<<"open edit place";

            database.transaction();

            // создаем форму для редактирования
            createNewPlacement dedit;
            dedit.setWindowTitle(tr("Редактирование мест размещений"));

            // если прилетело ОК
            if(dedit.exec() == QDialog::Accepted){

                database.commit();
                // перезаполняем места размещения
                requestPlacements();
            }else{
                database.rollback();
            }

        }else{
            // открываем диалог добавления мест размещения
            qDebug()<<"open add place";
            // определяем id по индексу модели
            QModelIndex index = proxyModel->mapToSource(selectionModel->currentIndex());

            if (!index.isValid())
                return;
            int id = model->data(index, Qt::UserRole).toInt();

            database.transaction();

            // создаем форму для редактирования
            AddPlace dedit;
            dedit.setWindowTitle(tr("Добавление мест размещений"));

            // передаем id QR-кода в таблицу place
            dedit.setIDqr(id);

            // если прилетело ОК
            if(dedit.exec() == QDialog::Accepted){

                dedit.changeStatus();
                database.commit();
                requestdatabase(mainRequest);
            }else{
                database.rollback();
            }
        }
    //}
}

void MainWindow::slot_newContact(){

    database.transaction();

    // создаем форму для редактирования
    CreateNewContact dedit;
    dedit.setWindowTitle(tr("Редактирование контактов"));

    // если прилетело ОК
    if(dedit.exec() == QDialog::Accepted){

        database.commit();
    }else{
        database.rollback();
    }
}

void MainWindow::slot_newHistory(){

    if(ui->tableView->currentIndex().isValid()){

        // запоминаем все выделенные строки
        QItemSelection selection(ui->tableView->selectionModel()->selection());
        QItemSelectionModel *selectionModel = ui->tableView->selectionModel();

        // определяем количество выделенных строк
        QList<int> rows;
        foreach(const QModelIndex &index, selection.indexes() ){
            rows.append(index.row());
        }
        // выделен должен быть только один
        if (!selectionModel->hasSelection() || rows.size() / MaxColumns > 1){
            qDebug()<<"NOT";
        }else{
            // определяем id по индексу модели
            QModelIndex index = proxyModel->mapToSource(selectionModel->currentIndex());

            if (!index.isValid())
                return;
            int id = model->data(index, Qt::UserRole).toInt();

            database.transaction();

            // создаем форму для редактирования
            CreateNewHistory dedit;
            dedit.setWindowTitle(tr("Редактирование историй"));

            // передаем id QR-кода в таблицу history
            dedit.setIDqr(id);
            // если прилетело ОК
            if(dedit.exec() == QDialog::Accepted){

                database.commit();
            }else{
                database.rollback();
            }
        }
    }
}

void MainWindow::setCurrentDate(){

    ui->dateEdit_s->setDate(QDate::currentDate());
    ui->dateEdit_po->setDate(QDate::currentDate());
}

void MainWindow::slot_resetDate(){

    ui->dateEdit_s->setDate(QDate::currentDate());
    ui->dateEdit_po->setDate(QDate::currentDate());
    // сбрасываем остальные виджеты
    ui->choiceStatus->setCurrentIndex(0);
    ui->choicePerformer->setCurrentIndex(0);
    ui->choicePlacement->setCurrentIndex(0);
}

void MainWindow::slot_changeDate_s(){

    // устанавливаем правильное соотношение дат
    QDate s(ui->dateEdit_s->date());
    QDate po(ui->dateEdit_po->date());

    if(s > po){
        ui->dateEdit_po->setDate(s);
    }
}

void MainWindow::slot_changeDate_po(){

    // устанавливаем правильное соотношение дат
    QDate s(ui->dateEdit_s->date());
    QDate po(ui->dateEdit_po->date());

    if(po < s){
        ui->dateEdit_s->setDate(po);
    }
}

void MainWindow::slot_exportToFile(){

    bool isExport = true;
    bool isSelect = false;
    // запоминаем все выделенные строки
    QItemSelection selection(ui->tableView->selectionModel()->selection());

    if(selection.isEmpty()){
        // выделенных нет, тогда если нет данных ничего не делаем. Если данные есть, экспортируем все
        if(model->rowsIsHave()){
            isExport = false;
        }
    }else{
        // иначе экспортируем только выделенные
        isSelect = true;
    }

    QString filename("");
    if(isExport){
        QFileDialog dialog;
        dialog.setConfirmOverwrite(true);
        filename = dialog.getSaveFileName(0, tr("Выберите путь для сохранения документа")
                                                  , tr("Новый"), "PDF (*.pdf)");
        if(filename.isEmpty())
            return;

        // очищаем предыдущую печать
        pageData.clearPages();
        // формируем документ
        exportDoc(isSelect, selection);

        QPrinter printDoc;
        printDoc.setPageMargins(parameters.at(0),parameters.at(1),
                                parameters.at(2),parameters.at(3),QPrinter::Millimeter);

        QTextDocument document;

        // передаем параметры страницы
        pageData.setParameters(parameters);

        // заполняем документ
        pageData.populateDocument(&document);
        printDoc.setOutputFileName(filename);
        printDoc.setOutputFormat(QPrinter::PdfFormat);
        document.print(&printDoc);
    }
}

void MainWindow::exportDoc(const bool &isSelect, const QItemSelection &selection){

    // список id QR-кодов
    QList<int> rows;

    // забиваем список выделенными
    if(isSelect){

        int item = 0;
        foreach(const QModelIndex &index, selection.indexes() ){
            item++;
            if(item % 3 == 0){
                rows.append(model->data(index, Qt::UserRole).toInt());
            }
        }
        qSort(rows);
    }else{
        rows = model->listRows();
    }

    QStringList list_1;
    QStringList list_2;
    QStringList list_3;
    QSqlQuery query_1;
    QSqlQuery query_2;
    QSqlQuery query_3;
    QSqlQuery queryPerformer;
    QSqlQuery queryPlacement;
    // забиваем в документ данные
    for(int i = 0; i < rows.count(); ++i){

        // производим выборку из qrcode и performers
        query_1.prepare("SELECT date_time, qrtext, performer FROM qrcode WHERE id=?");
        query_1.addBindValue(rows.at(i));
        query_1.exec();

        qDebug()<<"1";
        while(query_1.next()){
            list_1.append(query_1.value(0).toString());
            list_1.append(query_1.value(1).toString());

            QString tempPerform = query_1.value(2).toString();
            queryPerformer.prepare("SELECT performer FROM performers WHERE id="+tempPerform+";");
            queryPerformer.exec();
            if(queryPerformer.next()){
                list_1.append(queryPerformer.value(0).toString());
            }else{
                // предостережение
                list_1.append("NULL");
            }
        }

        qDebug()<<"2";
        // производим выборку из places и placements
        query_2.prepare("SELECT date_time, idplacement FROM places WHERE idqr=?");
        query_2.addBindValue(rows.at(i));
        query_2.exec();

        qDebug()<<"3";
        while(query_2.next()){
            list_2.append(query_2.value(0).toString());

            QString tempPlace = query_2.value(1).toString();
            queryPlacement.prepare("SELECT placement, phone, email FROM placements "
                                   "WHERE id="+tempPlace+";");
            queryPlacement.exec();
            if(queryPlacement.next()){
                list_2.append(queryPlacement.value(0).toString());
                list_2.append(queryPlacement.value(1).toString());
                list_2.append(queryPlacement.value(2).toString());
            }else{
                // предостережение
                list_2.append("NULL");
                list_2.append("NULL");
                list_2.append("NULL");
            }
        }

        qDebug()<<"4";
        // производим выборку из history
        query_3.prepare("SELECT date_time, event FROM history WHERE idqr=?");
        query_3.addBindValue(rows.at(i));
        query_3.exec();

        qDebug()<<"5";
        while(query_3.next()){
            list_3.append(query_3.value(0).toString());
            list_3.append(query_3.value(1).toString());
        }

        qDebug()<<"6";
        pageData.createPage(list_1, list_2, list_3);

        list_1.clear();
        list_2.clear();
        list_3.clear();
    }
}

void MainWindow::slot_saveImage(){

    bool isExport = true;
    bool isSelect = false;
    // запоминаем все выделенные строки
    QItemSelection selection(ui->tableView->selectionModel()->selection());

    if(selection.isEmpty()){
        // выделенных нет, тогда если нет данных ничего не делаем. Если данные есть, экспортируем все
        if(model->rowsIsHave()){
            isExport = false;
        }
    }else{
        // иначе экспортируем только выделенные
        isSelect = true;
    }

    if(isExport){
        QFileDialog dialog;
        QString filename(dialog.getExistingDirectory(0, tr("Выберите путь сохранения")));
        //filename = dialog.getSaveFileName(0, tr("Выберите путь для сохранения документа"),
        //                                          tr("Новый"), "PDF (*.pdf)");
        if(filename.isEmpty())
            return;

        // список id QR-кодов
        QStringList rows;

        // забиваем список выделенными
        if(isSelect){

            int item = 0;
            foreach(const QModelIndex &index, selection.indexes() ){
                item++;
                if(item % 3 == 0){
                    rows.append(model->data(index, 33).toString());
                }
            }
        }else{
            rows = model->listRowsPath();
        }

        // копируем файлы
        bool result;
        for(int i = 0; i < rows.count(); ++i){
            QFileInfo info(rows.at(i));
            QString str(info.baseName() + ".png");
            result = QFile::copy(rows.at(i), filename + QDir::separator() + str);
            qDebug()<<filename + str;
            if( !result){
                qDebug()<<"bad copy= ";
            }
        }
    }
}

void MainWindow::slot_viewQRText(){

    if(ui->tableView->currentIndex().isValid()){

        // выводим qrtext выбранной строки
        QItemSelection selection(ui->tableView->selectionModel()->selection());
        if(selection.isEmpty())
            return;
        int row = model->data(selection.indexes().at(0), Qt::UserRole).toInt();

        QString str_id = QString::number(row);
        QSqlQuery query;
        query.prepare("SELECT qrtext FROM qrcode WHERE id="+str_id+";");
        query.exec();
        if(query.next())
            ui->qrtext->setText(query.value(0).toString());
    }
}

void MainWindow::slot_settings(){

    // создаем форму настроек
    SettingsDialog dedit;
    dedit.setWindowTitle(tr("Настройка параметров страницы"));

    dedit.setParameters(parameters);

    // если прилетело ОК
    if(dedit.exec() == QDialog::Accepted){

        parameters = dedit.getParameters();
    }
}

void MainWindow::loadSettings(){

    setGeometry(settings->value("geometry", QRect(200, 200, 800, 650)).toRect());

    // параметры
    QList<int> list;
    list.append(settings->value("spTop", 25).toInt());
    list.append(settings->value("spLeft", 25).toInt());
    list.append(settings->value("spRight", 25).toInt());
    list.append(settings->value("spButton", 25).toInt());

    list.append(settings->value("spDP", 10).toInt());
    list.append(settings->value("spQRText", 10).toInt());
    list.append(settings->value("spHeaders", 10).toInt());
    list.append(settings->value("spTable", 10).toInt());
    list.append(settings->value("spHistory", 10).toInt());

    parameters = list;
}

void MainWindow::saveSettings(){

    settings->setValue("geometry", geometry());

    // параметры
    settings->setValue("spTop", parameters.at(0));
    settings->setValue("spLeft", parameters.at(1));
    settings->setValue("spRight", parameters.at(2));
    settings->setValue("spButton", parameters.at(3));

    settings->setValue("spDP", parameters.at(4));
    settings->setValue("spQRText", parameters.at(5));
    settings->setValue("spHeaders", parameters.at(6));
    settings->setValue("spTable", parameters.at(7));
    settings->setValue("spHistory", parameters.at(8));
}

void MainWindow::slot_about(){

    QString text("");
    text = QString("<html>\n<body>\n"
                   "<p style='font-size:12pt'>%1</p>"
                   "<p style='font-size:10pt'>%2</p>"
                   "<a href='https://code.google.com/p/alexorleon-diplom-project/'>code.google.com</a>"
                   "<p style='font-size:10pt'>%3</p>"
                   "</body>\n</html>\n").arg(tr("Информационная система сопровождения базы данных QR кодов и их генерирования"))
            .arg(tr("Автор: Есипенко Алексей Юрьевич"))
            .arg(tr("Эта программа создана в качестве дипломного проекта и является свободным программным обеспечением; вы можете распространять и/или изменять в соответствии с условиями "
                    "GNU General Public License опубликованной фондом Free Software Foundation; либо по лицензии версии 2, либо более поздней версией."));

    QMessageBox msgBox;
    msgBox.setWindowTitle(tr("О программе"));
    msgBox.setInformativeText(text);
    msgBox.setStandardButtons(QMessageBox::Close);
    msgBox.setDefaultButton(QMessageBox::Close);
    msgBox.button(QMessageBox::Close)->setText(tr("Закрыть"));
    msgBox.exec();
}
